package com.itcam.lease.web.app.controller.login;


import com.itcam.lease.common.annotation.CheckPermission;
import com.itcam.lease.common.context.LoginUserContext;
import com.itcam.lease.common.exception.LeaseException;
import com.itcam.lease.common.login.LoginUserHolder;
import com.itcam.lease.common.result.Result;
import com.itcam.lease.common.result.ResultCodeEnum;
import com.itcam.lease.web.app.service.LoginService;
import com.itcam.lease.web.app.vo.user.LoginVo;
import com.itcam.lease.web.app.vo.user.UserInfoVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@Tag(name = "登录管理")
@RequestMapping("/app/")
public class LoginController {

    @Autowired
    private LoginService loginService;

    /**
     * 获取短信验证码
     * @param phone
     * @return
     */
    @GetMapping("login/getCode")
    @Operation(summary = "获取短信验证码")
    public Result getCode(@RequestParam String phone) {
        loginService.getSMSCode(phone);
        return Result.ok();
    }

    /*

        登录注册校验逻辑
            - 前端发送手机号码`phone`和接收到的短信验证码`code`到后端。
            - 首先校验`phone`和`code`是否为空，若为空，直接响应`手机号码为空`或者`验证码为空`，若不为空则进入下步判断。
            - 根据`phone`从Redis中查询之前保存的验证码，若查询结果为空，则直接响应`验证码已过期` ，若不为空则进入下一步判断。
            - 比较前端发送的验证码和从Redis中查询出的验证码，若不同，则直接响应`验证码错误`，若相同则进入下一步判断。
            - 使用`phone`从数据库中查询用户信息，若查询结果为空，则创建新用户，并将用户保存至数据库，然后进入下一步判断。
            - 判断用户是否被禁用，若被禁，则直接响应`账号被禁用`，否则进入下一步。
            - 创建JWT并响应给前端。
     */

    /**
     * 登录
     * @param loginVo
     * @return
     */
    @PostMapping("login")
    @Operation(summary = "登录")
    public Result<String> login(LoginVo loginVo) {
        String token = loginService.login(loginVo);
        return Result.ok(token);
    }

    /**
     *
     * @return
     */
    @GetMapping("info")
    @Operation(summary = "获取登录用户信息")
    public Result<UserInfoVo> info() {
        UserInfoVo info = loginService.getUserInfoById(LoginUserHolder.getLoginUser().getUserId());
        return Result.ok(info);
    }

}
